package comprasdiretas.ejb;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import comprasdiretas.entity.PedidoEntity;
import comprasdiretas.entity.PedidoEntityPK;
import comprasdiretas.exception.ObjetoJaCadastradoException;
import comprasdiretas.exception.ParametroNullException;

/**
 * Session Bean implementation class PedidoController
 */
@Stateless
public class PedidoController implements PedidoControllerLocal {
	@PersistenceContext
	private EntityManager em;
    /**
     * Default constructor. 
     */
    public PedidoController() {
        // TODO Auto-generated constructor stub
    }
    
    @SuppressWarnings("unchecked")
	public void cadastrarPedido(int numPed, String proc, String fonte, String ptres,
    		Date data, String elemDespesa) throws ParametroNullException, ObjetoJaCadastradoException {
    	boolean naoCadastrar=false;//V�rias compras diretas em um mesmo processo
									//O pedido n�o precisa ser cadastrado novamente
    	
    	if (numPed<=0) {
			throw new ParametroNullException("Numero do Pedido vazio ou zero.");
		}else if(proc==null||proc.isEmpty()){
			throw new ParametroNullException("N�mero do processo vazio.");
		}else if(fonte==null||fonte.isEmpty()){
			throw new ParametroNullException("A fonte da despesa vazio.");
		}else if(ptres==null||ptres.isEmpty()){
			throw new ParametroNullException("O ptres da despesa vazio.");
		}else if(data==null){
			throw new ParametroNullException("A data do pedido vazio.");
		}else if(elemDespesa==null||elemDespesa.isEmpty()){
			throw new ParametroNullException("Elemento de despesa vazio.");
		}
    	
    	List<PedidoEntity> pedidosCadastrados = em.createNamedQuery("procurarPedidoPeloNumPedido").setParameter("numPedido", Integer.toString(numPed)).getResultList();
		if (pedidosCadastrados!=null&&!pedidosCadastrados.isEmpty()) {
			for (PedidoEntity pedidoEntity : pedidosCadastrados) {
				if (!pedidoEntity.getProcesso().equals(proc)) {
					throw new ObjetoJaCadastradoException("Pedido com n�mero "+numPed+" j� cadastrado.");		
				}
			}
			naoCadastrar=true;
		}
    	
		if (!naoCadastrar) {
			//persiste os dados do pedido
			PedidoEntityPK pk = new PedidoEntityPK(numPed,new SimpleDateFormat("yyyy").format(data));
			PedidoEntity novoPedido = new PedidoEntity(pk, data,elemDespesa,fonte, proc, ptres);
			em.persist(novoPedido);	
		}
    }
    
	@Override
	public comprasdiretas.entity.PedidoEntity consultaPedidoEntity(int numeroPed) {
		PedidoEntity pedidoEntity = em.find(PedidoEntity.class, numeroPed);

		return pedidoEntity;
	}

	@Override
	public void excluiPedidoEntity(PedidoEntity pedidoRemover) throws Exception {
		PedidoEntity pedidoEntity = em.find(PedidoEntity.class, pedidoRemover.getId());
		if (pedidoEntity==null) {
			throw new Exception("Pedido n�o localizado.");
		}
		em.remove(pedidoEntity);
	}

	@Override
	public void atualizaPedidoEntity(int numPed, String proc, String fonte, String ptres,
    		Date data, String elemDespesa)
			throws Exception {
		PedidoEntity pedidoEntity = em.find(PedidoEntity.class, numPed);
		if (pedidoEntity==null) {
			PedidoEntityPK pk = new PedidoEntityPK(numPed,new SimpleDateFormat("yyyy").format(data));
			pedidoEntity = new PedidoEntity(pk, data,elemDespesa,fonte, proc, ptres);
			em.persist(pedidoEntity);
		}else {
			pedidoEntity.setData(data);
			pedidoEntity.setElementoDespesa(elemDespesa);
			pedidoEntity.setFonte(fonte);
			pedidoEntity.setProcesso(proc);
			pedidoEntity.setPtres(ptres);	
		}
				
	}

	
	@Override
	public void detalharElementoDespesa(int numPed, String elemDespesa)
			throws Exception {
		PedidoEntity pedidoEntity = em.find(PedidoEntity.class, numPed);
		if (pedidoEntity==null) {
			throw new Exception("Pedido com n�mero "+numPed+" n�o localizado.");
		}
			pedidoEntity.setElementoDespesa(elemDespesa);	
	}

}
